package com.zsrd.lessons.mapper;

import com.baomidou.mybatisplus.annotation.SqlParser;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import com.zsrd.lessons.domain.TsExamPlan;
import com.zsrd.lessons.domain.TsExamQuestion;
import com.zsrd.lessons.domain.dto.ExamPlanDto;
import com.zsrd.lessons.domain.vo.ExamPlanVo;
import com.zsrd.lessons.domain.vo.ExamVo;
import com.zsrd.lessons.domain.vo.FinalScoring;
import com.zsrd.lessons.domain.vo.TsExamQuestionVo;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**
 * <p>
 * 考试计划表 Mapper 接口
 * </p>
 *
 * @author Chen Wei
 * @since 2022-07-11
 */
public interface TsExamPlanMapper extends BaseMapper<TsExamPlan> {

    /**
     * 新增考试计划
     * @param examPlanDto
     * @return 主键ID
     */
    int  addPlan(@Param(value = "tsExamPlan") ExamPlanDto examPlanDto);

    /**
     *关联考试计划与人员
     * @param userIds 考试关联用户集合
     * @param planId   计划id
     * @return 写入成功数量
     */
    int addPlanUser(@Param(value = "userIds") String[] userIds, @Param(value = "planId") int planId);

    /**
     * 查询考试计划
     * @param page
     * @param orgNo
     * @return
     */
    IPage<ExamPlanVo> queryExamPlan(@Param(value = "page") IPage page, @Param(value = "orgNo") String orgNo, @Param(value = "keyword") String keyword);



    /**
     * 给人员增加考试信息(模拟考试) 单条新增 ，返回新增主键id
     * @param examPlanDto
     * @return
     */
    int addExam1(@Param(value = "tsExamPlan") ExamPlanDto examPlanDto);

    /**
     * 给人员增加考试信息(正式考试) 多条新增
     * @param examPlanDto
     * @return
     */
    int addExam2(@Param(value = "tsExamPlan") ExamPlanDto examPlanDto);

    /**
     * 给人员增加考试信息(正式考试) 多条新增
     * @param examPlanDto
     * @return
     */
    int addExam2New(@Param(value = "tsExamPlan") ExamPlanDto examPlanDto);
    /**
     * 查询考试管理
     * @param page
     * @param orgNo
     * @return
     */
    public IPage<ExamVo> queryExam(Page<ExamVo> page, @Param(value = "orgNo") String orgNo, @Param(value = "keyword") String keyword);

    /**
     * 我的考试查询
     * @param page
     * @param userId
     * @return
     */
    @SqlParser(filter = true)
    IPage<ExamVo> queryMyExam(Page<ExamVo> page, @Param(value = "userId") String userId);

    /**
     * 给人员增加考试信息
     * @param examPlanDto
     * @return
     */
    int updateExam(@Param(value = "tsExamPlan") ExamPlanDto examPlanDto);

    /**
     * 删除试卷信息 ts_exam
     * @param id
     * @return
     */
    int delExam(@Param(value = "pid") Integer id);

    /**
     * 查询考试计划题目数量及难度 所属题库信息
     * @param id 试卷id
     * @return
     */
    ExamVo selectExam(@Param(value = "id") int id);

    /**
     * 更新试卷成绩
     * @param id  试卷id
     * @param result  试卷成绩
     * @param topicCnt  已做题目数量
     * @return
     */
    int updateResult(@Param(value = "id") int id, @Param(value = "result") int result, @Param(value = "topicCnt") int topicCnt, @Param("totalTimes") Long totalTimes, @Param("status") Integer status);

    /**
     * 写入试卷答题详情
     * @param orgNo
     * @param id
     * @param questions
     */
    int insertBatchQuestions(@Param(value = "orgNo") String orgNo, @Param(value = "id") int id, @Param(value = "questions") List<TsExamQuestion> questions);

    /**
     * 考试成绩查询
     * @param id
     * @return
     */
    ExamVo selectExamResult(@Param(value = "id") int id);

    /**
     * 答题详情
     * @param id
     * @return
     */
    List<TsExamQuestionVo>  selectExamQuestionsResult(int id);

    /**
     * 随机抽取题目数量
     * @param diff 难度，1初级，2中级，3高级
     * @param bids  所属题库 可多选 ，多个题库id以逗号拼接
     * @param questionType 题目类型 1单选，2多选，3判断
     * @param questionNum  题目数量
     * @return
     */
    List<TsExamQuestionVo> queryRoundQuestions(@Param(value = "diff") String diff,
                                               @Param(value = "bids") String bids,
                                               @Param(value = "questionType") int questionType,
                                               @Param(value = "questionNum") int questionNum);

    List<String> queryIsHaveExam(@Param(value = "userId") String userId,
                                 @Param(value = "examTime") Date examTime,
                                 @Param(value = "limitTime") Integer limitTime,
                                 @Param(value = "id") Integer id);


    List<FinalScoring> finalScoring(@Param(value = "id") int id);

}
